From 4813e0d9725b5189f135e7fb3dcf5085a2d09122 Mon Sep 17 00:00:00 2001 From: robertl Date: Tue, 7 Feb 2006 18:28:56 +0000 Subject: [PATCH] Gustavo Niemeyer contributes support for GPS TrackMaker GTM files. --- gpsbabel/Makefile | 1 + gpsbabel/README | 9 + gpsbabel/gtm.c | 754 ++++++++++++++++++++++++++++++++++ gpsbabel/readme.xml | 10 + gpsbabel/reference/sample.gtm | Bin 0 -> 90544 bytes gpsbabel/testo | 8 + gpsbabel/vecs.c | 109 ++--- 7 files changed, 840 insertions(+), 51 deletions(-) create mode 100644 gpsbabel/gtm.c create mode 100644 gpsbabel/reference/sample.gtm diff --git a/gpsbabel/Makefile b/gpsbabel/Makefile index e265f0e08..6000a4af2 100644 --- a/gpsbabel/Makefile +++ b/gpsbabel/Makefile @@ -36,6 +36,7 @@ CFLAGS=$(EXTRA_CFLAGS) $(DEBUGGING) -Icoldsync $(INHIBIT_EXPAT) $(INHIBIT_USB) $ INSTALL_TARGETDIR=/usr/local/ FMTS=magproto.o gpx.o geo.o mapsend.o mapsource.o garmin_tables.o \ + gtm.o \ gpsutil.o pcx.o cetus.o copilot.o gpspilot.o magnav.o \ psp.o holux.o garmin.o tmpro.o tpg.o tpo.o \ xcsv.o gcdb.o tiger.o internal_styles.o easygps.o quovadis.o \ diff --git a/gpsbabel/README b/gpsbabel/README index 798853de3..d929c5f86 100644 --- a/gpsbabel/README +++ b/gpsbabel/README @@ -1201,6 +1201,15 @@ THE FORMATS a default radius (proximity) snlen: Length of generated short names (default 16) + GTM + + Input and output support for waypoints, tracks and routes in + the GPS TrackMaker binary format. For more information check: + + http://www.gpstm.com + + Code implemented by Gustavo Niemeyer. + DATA FILTERS diff --git a/gpsbabel/gtm.c b/gpsbabel/gtm.c new file mode 100644 index 000000000..50166ab7f --- /dev/null +++ b/gpsbabel/gtm.c @@ -0,0 +1,754 @@ +/* + Support for GPS TrackMaker data file. + + Copyright (C) 2005 Gustavo Niemeyer . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA +*/ + +#include "defs.h" + +static FILE *fd, *ofd; +static int indatum; +static int wp_count; +static int ws_count; +static int tr_count; +static int ts_count; +static int rt_count; +static int im_count; +static const route_head *rte_active; +static int start_new; + +#define MYNAME "GTM" +#define EPOCH89DIFF 631076400 +#define WAYPOINTSTYLES \ + "\xf5\xff\xff\xff\x0f\x00Times New Roman\x00\x00\x00\x00\x00\x90\x01"\ + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"\ + "\xf5\xff\xff\xff\x0f\x00Times New Roman\x01\x00\x00\x00\x00\x90\x01"\ + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"\ + "\xf5\xff\xff\xff\x0f\x00Times New Roman\x02\x00\x00\x00\x00\x90\x01"\ + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"\ + "\xf5\xff\xff\xff\x0f\x00Times New Roman\x03\x00\x00\x00\x00\x90\x01"\ + "\x00\x00\x00\x00\x00\x00\x8b\xff\xff\xff\xff\x00\x00\x00\x00\x00\x01" + +#define unknown_alt_gtm -10000000 + +/* Read functions, according to specification. */ + +static void +fread_discard(FILE *fd, int len) +{ + char buf[1024]; + fread(buf, 1, len, fd); +} + +static unsigned char +fread_byte(FILE *fd) +{ + unsigned char buf[1]; + fread(buf, 1, 1, fd); + return buf[0]; +} + +static short int +fread_bool(FILE *fd) +{ + char buf[2]; + fread(buf, 2, 1, fd); + return le_read16(buf) ? 1 : 0; +} + +static short int +fread_integer(FILE *fd) +{ + char buf[2]; + fread(buf, 2, 1, fd); + return le_read16(buf); +} + +static int +fread_long(FILE *fd) +{ + char buf[4]; + fread(buf, 4, 1, fd); + return le_read32(buf); +} + +static float +fread_single(FILE *fd) +{ + unsigned char buf[4]; + float f; + int i; + fread(buf, 4, 1, fd); + i = le_read32(buf); + memcpy(&f, &i, 4); + return f; +} + +static double +fread_double(FILE *fd) +{ + char buf[8]; + double d; + fread(buf, 8, 1, fd); + le_read64(&d, buf); + return d; +} + +static char * +fread_string(FILE *fd) +{ + int len = fread_integer(fd); + char *val = xmalloc(len+1); + fread(val, 1, len, fd); + while (len != 0 && val[len-1] == ' ') + len--; + val[len] = 0; + return val; +} + +static char * +fread_fixedstring(FILE *fd, int len) +{ + char *val = xmalloc(len+1); + fread(val, 1, len, fd); + while (len != 0 && val[len-1] == ' ') + len--; + val[len] = 0; + return val; +} + +/* Write functions, according to specification. */ + +static void +fwrite_null(FILE *fd, int len) +{ + char buf[1024]; + memset(buf, 0, len); + fwrite(buf, 1, len, fd); +} + +static void +fwrite_byte(FILE *fd, unsigned char val) +{ + fwrite(&val, 1, 1, fd); +} + +static void +fwrite_bool(FILE *fd, short int val) +{ + char buf[2]; + buf[0] = buf[1] = val ? 0xff : 0x00; + fwrite(buf, 2, 1, fd); +} + +static void +fwrite_integer(FILE *fd, short int val) +{ + char buf[2]; + le_write16(buf, val); + fwrite(buf, 2, 1, fd); +} + +static void +fwrite_long(FILE *fd, int val) +{ + char buf[4]; + le_write32(buf, val); + fwrite(buf, 4, 1, fd); +} + +static void +fwrite_single(FILE *fd, float val) +{ + char buf[4]; + int i; + memcpy(&i, &val, 4); + le_write32(buf, i); + fwrite(buf, 4, 1, fd); +} + +static void +fwrite_double(FILE *fd, double val) +{ + char buf[8]; + le_read64(buf, &val); + fwrite(buf, 8, 1, fd); +} + +static void +fwrite_string(FILE *fd, const char *str) +{ + if (str && str[0]) { + int len = strlen(str); + fwrite_integer(fd, len); + fwrite(str, 1, len, fd); + } + else { + fwrite_integer(fd, 0); + } +} + +static char * +fwrite_fixedstring(FILE *fd, const char *str, int fieldlen) +{ + int len = str ? strlen(str) : 0; + if (len > fieldlen) + len = fieldlen; + if (str) + fwrite(str, 1, len, fd); + for (; len != fieldlen; len++) + fputc(' ', fd); +} + +/* Auxiliar functions */ + +void +set_datum(int n) +{ + indatum = -1; + if (n < 1) {} + else if (n < 8) { indatum = 0; } /* Adindan */ + else if (n < 9) { indatum = 1; } /* Afgooye */ + else if (n < 10) { indatum = 2; } /* Ain el Abd */ + else if (n < 14) {} + else if (n < 23) { indatum = 6; } /* ARC 1950 */ + else if (n < 26) { indatum = 7; } /* ARC 1960 */ + else if (n < 27) { indatum = 8; } /* Ascension Island 58 */ + else if (n < 32) {} + else if (n < 33) { indatum = 13; } /* Australian Geo 84 */ + else if (n < 34) {} + else if (n < 35) { indatum = 15; } /* Bellevue IGN */ + else if (n < 36) { indatum = 16; } /* Bermuda 1957 */ + else if (n < 38) {} + else if (n < 39) { indatum = 17; } /* Bukit Rimpah */ + else if (n < 40) { indatum = 18; } /* Camp Area Astro */ + else if (n < 41) { indatum = 19; } /* Campo Inchauspe */ + else if (n < 42) { indatum = 22; } /* Canton Islan 1966 */ + else if (n < 43) { indatum = 23; } /* Cape */ + else if (n < 44) { indatum = 24; } /* Cape Canaveral */ + else if (n < 45) { indatum = 26; } /* Carthe */ + else if (n < 46) { indatum = 28; } /* Chatham */ + else if (n < 47) { indatum = 29; } /* Chua Astro */ + else if (n < 48) { indatum = 30; } /* Corrego Alegre*/ + else if (n < 50) {} + else if (n < 51) { indatum = 33; } /* Djakarta (Batavia) */ + else if (n < 52) { indatum = 34; } /* DOS 1968 */ + else if (n < 53) { indatum = 35; } /* Easter Island 1967 */ + else if (n < 54) {} + else if (n < 69) { indatum = 38; } /* European 1950 Mean */ + else if (n < 70) { indatum = 39; } /* European 1979 Mean */ + else if (n < 71) {} + else if (n < 72) { indatum = 41; } /* Gandajika */ + else if (n < 73) { indatum = 42; } /* Geodetic Datum 49 */ + else if (n < 74) {} + else if (n < 75) { indatum = 45; } /* Guam 1963 */ + else if (n < 76) { indatum = 46; } /* Gunung Segara */ + else if (n < 77) {} + else if (n < 78) { indatum = 49; } /* Hearth North */ + else if (n < 79) {} + else if (n < 80) { indatum = 50; } /* Hjorsey 1955 */ + else if (n < 81) { indatum = 51; } /* Hong Kong 1963 */ + else if (n < 82) { indatum = 52; } /* Hu-Tzu-Shan */ + else if (n < 89) { indatum = 53; } /* Indian */ + else if (n < 90) {} + else if (n < 91) { indatum = 55; } /* Ireland 1965 */ + else if (n < 92) {} + else if (n < 93) { indatum = 56; } /* ISTS 073 69 */ + else if (n < 94) { indatum = 57; } /* Johnston Island 61 */ + else if (n < 95) { indatum = 58; } /* Kandawala */ + else if (n < 96) { indatum = 59; } /* Kerguelen Island */ + else if (n < 97) { indatum = 60; } /* Kertau 48 */ + else if (n < 99) {} + else if (n < 100) { indatum = 61; } /* L.C. 5 Astro */ + else if (n < 101) {} + else if (n < 102) { indatum = 63; } /* Liberia 1964 */ + else if (n < 104) { indatum = 64; } /* Luzon */ + else if (n < 105) {} + else if (n < 106) { indatum = 65; } /* Mahe 1971 */ + else if (n < 107) {} + else if (n < 108) { indatum = 69; } /* Merchich */ + else if (n < 109) { indatum = 71; } /* Midway Astro 61 */ + else if (n < 111) { indatum = 73; } /* Minna */ + else if (n < 112) {} + else if (n < 115) { indatum = 75; } /* Nahrwan */ + else if (n < 116) { indatum = 76; } /* Naparima BWI */ + else if (n < 116) {} + else if (n < 119) { indatum = 3; } /* Alaska NAD27 */ + else if (n < 121) { indatum = 14; } /* Bahamas NAD27 */ + else if (n < 126) { indatum = 20; } /* Canada Mean NAD27 */ + else if (n < 127) { indatum = 21; } /* Canal Zone NAD27 */ + else if (n < 128) { indatum = 31; } /* Cuba NAD27 */ + else if (n < 129) { indatum = 44; } /* Greenland NAD27 */ + else if (n < 131) {} + else if (n < 132) { indatum = 20; } /* Canada Mean NAD27 */ + else if (n < 135) {} + else if (n < 136) { indatum = 70; } /* Mexico NAD27 */ + else if (n < 144) {} + else if (n < 145) { indatum = 80; } /* Old Egyptian */ + else if (n < 146) { indatum = 81; } /* Old Hawaiian */ + else if (n < 147) { indatum = 82; } /* Old Hawaiian Kauai */ + else if (n < 148) { indatum = 83; } /* Old Hawaiian Maui */ + else if (n < 149) { indatum = 81; } /* Old Hawaiian Mean */ + else if (n < 150) { indatum = 84; } /* Old Hawaiian Oahu */ + else if (n < 151) { indatum = 85; } /* Oman */ + else if (n < 156) { indatum = 86; } /* OSG Britain */ + else if (n < 157) { indatum = 87; } /* Pico de Las Nieves */ + else if (n < 158) { indatum = 88; } /* Pitcairn Astro 67 */ + else if (n < 171) {} + else if (n < 172) { indatum = 91; } /* Puerto Rico */ + else if (n < 173) { indatum = 92; } /* Pulkovo 1942 */ + else if (n < 174) { indatum = 94; } /* Quatar National */ + else if (n < 176) {} + else if (n < 177) { indatum = 95; } /* Rome 1940 */ + else if (n < 184) { indatum = 96; } /* S-42 (Pulkovo 1942) */ + else if (n < 185) {} + else if (n < 186) { indatum = 100; } /* Santo DOS */ + else if (n < 187) { indatum = 99; } /* Sao Braz */ + else if (n < 191) {} + else if (n < 193) { indatum = 105; } /* SAD-69/Mean */ + else if (n < 194) { indatum = 98; } /* SAD-69/Brazil */ + else if (n < 204) { indatum = 105; } /* SAD-69/Mean */ + else if (n < 205) { indatum = 106; } /* South Asia */ + else if (n < 206) { indatum = 109; } /* Tananarive 1926 */ + else if (n < 207) { indatum = 111; } /* Timbalai 1948 */ + else if (n < 211) { indatum = 112; } /* Tokyo mean */ + else if (n < 212) { indatum = 113; } /* Tristan Astro 1968 */ + else if (n < 213) { indatum = 115; } /* Viti Levu 1916 */ + else if (n < 215) {} + else if (n < 216) { indatum = 116; } /* Wake Eniwetok 1960 */ + else if (n < 217) { indatum = 117; } /* WGS 72 */ + else if (n < 218) { indatum = 118; } /* WGS 84 */ + else if (n < 219) { indatum = 119; } /* Yacare */ + else if (n < 220) { indatum = 120; } /* Zanderij */ + else if (n < 231) {} + else if (n < 232) { indatum = 98; } /* SAD-69/Brazil*/ + else if (n < 234) {} + else if (n < 235) { indatum = 117; } /* WGS 72 */ + else if (n < 236) { indatum = 0; } /* Adindan */ + else if (n < 237) { indatum = 2; } /* Ain el Abd */ + else if (n < 238) { indatum = 7; } /* ARC 1960 */ + else if (n < 239) { indatum = 8; } /* Ascension Island 58 */ + else if (n < 241) {} + else if (n < 242) { indatum = 52; } /* Hu-Tzu-Shan */ + else if (n < 245) { indatum = 53; } /* Indian */ + else if (n < 246) {} + else if (n < 247) { indatum = 57; } /* Johnston Island 61 */ + else if (n < 248) { indatum = 64; } /* Luzon */ + else if (n < 249) {} + else if (n < 250) { indatum = 75; } /* Nahrwan */ + else if (n < 251) { indatum = 76; } /* Naparima BWI */ + else if (n < 254) {} + else if (n < 255) { indatum = 82; } /* Old Hawaiian Kauai */ + else if (n < 256) { indatum = 83; } /* Old Hawaiian Maui */ + else if (n < 257) { indatum = 84; } /* Old Hawaiian Oahu */ + else if (n < 259) {} + else if (n < 260) { indatum = 101; } /* Sapper Hill 43 */ + else if (n < 261) { indatum = 111; } /* Timbalai 1948 */ + else if (n < 262) { indatum = 112; } /* Tokyo mean */ + else if (n < 263) { indatum = 116; } /* Wake Eniwetok 1960 */ + + if (indatum == -1) + warning(MYNAME ": Unsupported datum (%d), won't convert to WGS84\n", n); +} + +static const char *icon_descr[] = { +"", "Airport", "Ball Park", "Bank", "Bar", "Boat Ramp", "Campground", "Car", +"City (Large)", "City (Medium)", "City (Small)", "Dam", "Danger Area", +"Drinking Water", "Fishing Area", "Gas Station", "Glider Area", "Golf Course", +"Heliport", "Hotel", "Animals", "Information", "Man Overboard", "Marina", +"Mine", "Medical Facility", "Parachute Area", "Park", "Parking Area", +"Picnic Area", "Private Field", "Residence", "Restaurant", "Restroom", +"Scenic Area", "School", "Seaplane Base", "Shipwreck", "Shopping Center", +"Short Tower", "Policy Station", "Ski Resort", "Soft Field", "Swimming Area", +"Tall Tower", "Telephone", "Tracback Point", "Ultralight Area", "Waypoint", +"Boat", "Exit", "Flag", "Duck", "Buoy", "Back Track", "Beach", "Bridge", +"Building", "Car Repair", "Cemetery", "Church", "Civil", "Convenience Store", +"Crossing", "Fast Food", "Forest", "Ghost Town", "Levee", "Military", +"Oil Field", "Post Office", "Rv Park", "Scales", "Summit", "Toll Booth", +"Trail Head", "Truck Stop", "Tunnel", "Highway", "Gate", "Fall", "Fence", +"Mata-Burro", "Fitness Center", "Movie Theater", "Live Theater", "Zoo", "Horn", +"Bowling", "Car Rental", "City (Capitol)", "Controlled Area", "Stadium", +"Museum", "Amusement Park", "Skull", "Department Store", "Pharmacy", "Pizza", +"Diver Down Flag 1", "Light", "Pin", "", "Pigsty", "Tree", "Bamboo", +"Banana Plant", "Arrow-Down", "Bifurcation", "Cavern", "River", "Rock", +"Arrow-Up", "Trunk", "Soccer Field", "Sporting Court", "Flag, Green", "Trench", +"Ship-Yellow", "Green Sign", "Swamp", "Lake", "Stop!", +"Fishing Hot Spot Facility", "Speed Reducer", "Stairway", "Cactus", "Ship-Red", +"Letter - S", "Letter - D", "Letter - N", +"Crossing", "Cross", "Flag, Red", "Curve1", "Curve2", "Curve3", "Curve4", +"Letter - W", "Letter - L", "Letter - R", "Radio Beacon", "Road Sign", +"Geocache", "Geocache Found", "Traffic Light", "Bus Station", "Train Station", +"School", "Mile Marker", "Conservation Area", "Waypoint", "Box", "Aerial", +"Auto Repair", "Boat", "Exit Ramp", "Fixed Nav Aid", "Floating Buoy", "Garden", +"Fish Farm", "Lighthouse", "Truck Service", "Resort", "Scuba", "Shooting", +"Sight Seeing", "Sounding", "Winery", "Navaid, Amber", "Navaid, Black", +"Navaid, Blue", "Navaid, Green", "Navaid, Green/Red", "Navaid, Green/White", +"Navaid, Orange", "Navaid, Red", "Navaid, Red/Green", "Navaid, Red/White", +"Navaid, Violet", "Navaid, White", "Navaid, White/Green", "Navaid, White/Red", +"Buoy, White", "Dot, White", "Red Square", "Red Diamond", "Green Square", +"Green Diamond", "Restricted Area", "Navaid (unlit)", "Dot (Small)", "Libraries", "Waypoint", "Waypoint1", +"Waypoint2", "Mark (1)", "Mark (2)", "Mark (3)", "Cross (Red)", "Store", +"Exclamation", "Flag (EUA)", "Flag (CAN)", "Flag (BRA)", "Man", "Animals", +"Deer Tracks", "Tree Stand", "Bridge", "Fence", "Intersection", +"Non Direct Beacon", "VHF Omni Range", "Vor/Tacan", "Vor-Dme", +"1st Approach Fix", "Localizer Outer", "Missed Appr. Pt", "Tacan", +"CheckPoint", NULL +}; + + +void convert_datum(double *lat, double *lon) +{ + double amt; + if (indatum != -1 && indatum != 118) { + GPS_Math_Known_Datum_To_WGS84_M(*lat, *lon, 0.0, + lat, lon, &amt, indatum); + } +} + +/* Callbacks */ + +static void +gtm_rd_init(const char *fname) +{ + char buf[256]; + int version; + char *name; + fd = xfopen(fname, "r", MYNAME); + version = fread_integer(fd); + name = fread_fixedstring(fd, 10); + if (version == -29921) + fatal(MYNAME ": Uncompress the file first\n"); + if (strcmp(name, "TrackMaker") != 0) + fatal(MYNAME ": Invalid file format\n"); + if (version != 211) + fatal(MYNAME ": Invalid format version\n"); + free(name); + + /* Header */ + fread_discard(fd, 15); + ws_count = fread_long(fd); + fread_discard(fd, 4); + wp_count = fread_long(fd); + tr_count = fread_long(fd); + rt_count = fread_long(fd); + fread_discard(fd, 16); + im_count = fread_long(fd); + ts_count = fread_long(fd); + fread_discard(fd, 28); + fread_string(fd); + fread_string(fd); + fread_string(fd); + fread_string(fd); + + /* User Grid and Datum */ + fread_discard(fd, 34); + set_datum(fread_integer(fd)); + fread_discard(fd, 22); +} + +static void +gtm_rd_deinit(void) +{ + fclose(fd); +} + +static void count_route_waypts(const waypoint *wpt) { rt_count++; } +static void count_track_waypts(const waypoint *wpt) { tr_count++; } + +static void +gtm_wr_init(const char *fname) +{ + rt_count = tr_count = 0; + track_disp_all(NULL, NULL, count_track_waypts); + route_disp_all(NULL, NULL, count_route_waypts); + + ofd = xfopen(fname, "w", MYNAME); + + /* Header */ + fwrite_integer(ofd, 211); + fwrite_fixedstring(ofd, "TrackMaker", 10); + fwrite_byte(ofd, 0); + fwrite_byte(ofd, 0); + fwrite_byte(ofd, 8); + fwrite_byte(ofd, 0); + fwrite_byte(ofd, 0); + fwrite_byte(ofd, 0); + fwrite_byte(ofd, 0); + fwrite_long(ofd, 0); + fwrite_long(ofd, 16777215); + fwrite_long(ofd, waypt_count() ? 4 : 0); /* num waypoint styles */ + fwrite_long(ofd, 0); + fwrite_long(ofd, waypt_count()); /* num waypoints */ + fwrite_long(ofd, tr_count); + fwrite_long(ofd, rt_count); + fwrite_single(ofd, 0); /* maxlon */ + fwrite_single(ofd, 0); /* minlon */ + fwrite_single(ofd, 0); /* maxlat */ + fwrite_single(ofd, 0); /* minlat */ + fwrite_long(ofd, 0); + fwrite_long(ofd, track_count()); /* num tracklog styles */ + fwrite_single(ofd, 0); + fwrite_single(ofd, 0); + fwrite_bool(ofd, 0); + fwrite_bool(ofd, 0); + fwrite_bool(ofd, 0); + fwrite_bool(ofd, 0); + fwrite_bool(ofd, 0); + fwrite_bool(ofd, 0); + fwrite_bool(ofd, 0); + fwrite_bool(ofd, 0); + fwrite_bool(ofd, 0); + fwrite_bool(ofd, 0); + fwrite_string(ofd, "Times New Roman"); + fwrite_string(ofd, ""); + fwrite_string(ofd, ""); + fwrite_string(ofd, ""); + + /* User Grid and Datum */ + fwrite_null(ofd, 34); + fwrite_integer(ofd, 217); /* WGS84 */ + fwrite_null(ofd, 22); +} + +static void +gtm_wr_deinit(void) +{ + fclose(ofd); +} + +static void +gtm_read(void) +{ + route_head *first_trk_head = NULL; + route_head *trk_head = NULL; + route_head *rte_head = NULL; + waypoint *wpt; + int real_tr_count = 0; + char *route_name; + int icon; + int i; + + /* Image information */ + for (i = 0; i != im_count; i++) { + fread_string(fd); + fread_string(fd); + fread_discard(fd, 30); + } + + /* Waypoints */ + for (i = 0; i != wp_count; i++) { + wpt = waypt_new(); + wpt->latitude = fread_double(fd); + wpt->longitude = fread_double(fd); + convert_datum(&wpt->latitude, &wpt->longitude); + wpt->shortname = fread_fixedstring(fd, 10); + wpt->description = fread_string(fd); + icon = fread_integer(fd); + if (icon < sizeof(icon_descr)/sizeof(char*)) + wpt->icon_descr = icon_descr[icon]; + fread_discard(fd, 1); + wpt->creation_time = fread_long(fd); + if (wpt->creation_time) + wpt->creation_time += EPOCH89DIFF; + fread_discard(fd, 2); + wpt->altitude = fread_single(fd); + if (wpt->altitude == unknown_alt_gtm) + wpt->altitude = unknown_alt; + fread_discard(fd, 2); + waypt_add(wpt); + } + + /* Waypoint Styles */ + if (wp_count) { + for (i = 0; i != ws_count; i++) { + fread_discard(fd, 4); + fread_string(fd); + fread_discard(fd, 24); + } + } + + /* Tracklogs */ + for (i = 0; i != tr_count; i++) { + wpt = waypt_new(); + wpt->latitude = fread_double(fd); + wpt->longitude = fread_double(fd); + convert_datum(&wpt->latitude, &wpt->longitude); + wpt->creation_time = fread_long(fd); + if (wpt->creation_time) + wpt->creation_time += EPOCH89DIFF; + start_new = fread_byte(fd); + wpt->altitude = fread_single(fd); + if (wpt->altitude == unknown_alt_gtm) + wpt->altitude = unknown_alt; + if (start_new || !trk_head) { + trk_head = route_head_alloc(); + track_add_head(trk_head); + real_tr_count++; + if (!first_trk_head) + first_trk_head = trk_head; + } + route_add_wpt(trk_head, wpt); + } + + /* Tracklog styles */ + trk_head = first_trk_head; + for (i = 0; i != ts_count && i != real_tr_count; i++) { + trk_head->rte_name = fread_string(fd); + fread_discard(fd, 12); + trk_head = (route_head *)QUEUE_NEXT(&trk_head->Q); + } + + /* Routes */ + for (i = 0; i != rt_count; i++) { + wpt = waypt_new(); + wpt->latitude = fread_double(fd); + wpt->longitude = fread_double(fd); + convert_datum(&wpt->latitude, &wpt->longitude); + wpt->shortname = fread_fixedstring(fd, 10); + wpt->description = fread_string(fd); + route_name = fread_string(fd); + icon = fread_integer(fd); + if (icon < sizeof(icon_descr)/sizeof(char*)) + wpt->icon_descr = icon_descr[icon]; + fread_discard(fd, 1); + start_new = fread_byte(fd); + fread_discard(fd, 6); + wpt->altitude = fread_single(fd); + if (wpt->altitude == unknown_alt_gtm) + wpt->altitude = unknown_alt; + fread_discard(fd, 2); + + if (start_new || !rte_head) { + rte_head = route_head_alloc(); + rte_head->rte_name = route_name; + route_add_head(rte_head); + } + else { + free(route_name); + } + route_add_wpt(rte_head, wpt); + } +} + +int icon_from_descr(const char *descr) +{ + int i = 0; + if (descr) { + for (; i != sizeof(icon_descr)/sizeof(char*); i++) + if (strcmp(icon_descr[i], descr) == 0) + return i; + } + return 48; +} + +static void write_waypt(const waypoint *wpt) +{ + fwrite_double(ofd, wpt->latitude); + fwrite_double(ofd, wpt->longitude); + fwrite_fixedstring(ofd, wpt->shortname, 10); + fwrite_string(ofd, wpt->description); + fwrite_integer(ofd, icon_from_descr(wpt->icon_descr)); + fwrite_byte(ofd, 3); + if (wpt->creation_time) + fwrite_long(ofd, wpt->creation_time-EPOCH89DIFF); + else + fwrite_long(ofd, 0); + fwrite_integer(ofd, 0); + if (wpt->altitude == unknown_alt) + fwrite_single(ofd, unknown_alt_gtm); + else + fwrite_single(ofd, wpt->altitude); + fwrite_integer(ofd, 0); +} + +static void start_rte(const route_head *rte) +{ + rte_active = rte; + start_new = 1; +} + +static void write_trk_waypt(const waypoint *wpt) +{ + fwrite_double(ofd, wpt->latitude); + fwrite_double(ofd, wpt->longitude); + fwrite_long(ofd, wpt->creation_time-EPOCH89DIFF); + fwrite_byte(ofd, start_new); + if (wpt->altitude == unknown_alt) + fwrite_single(ofd, unknown_alt_gtm); + else + fwrite_single(ofd, wpt->altitude); + start_new = 0; +} + +static void write_trk_style(const route_head *trk) +{ + fwrite_string(ofd, trk->rte_name); + fwrite_byte(ofd, 1); + fwrite_long(ofd, 0); + fwrite_single(ofd, 0); + fwrite_byte(ofd, 0); + fwrite_integer(ofd, 0); +} + +static void write_rte_waypt(const waypoint *wpt) +{ + fwrite_double(ofd, wpt->latitude); + fwrite_double(ofd, wpt->longitude); + fwrite_fixedstring(ofd, wpt->shortname, 10); + fwrite_string(ofd, wpt->description); + fwrite_string(ofd, rte_active->rte_name); + fwrite_integer(ofd, icon_from_descr(wpt->icon_descr)); + fwrite_byte(ofd, 3); + fwrite_byte(ofd, start_new); + fwrite_long(ofd, 0); + fwrite_integer(ofd, 0); + if (wpt->altitude == unknown_alt) + fwrite_single(ofd, unknown_alt_gtm); + else + fwrite_single(ofd, wpt->altitude); + fwrite_integer(ofd, 0); + start_new = 0; +} + +static void +gtm_write(void) +{ + waypt_disp_all(write_waypt); + if (waypt_count()) + fwrite(WAYPOINTSTYLES, 1, sizeof(WAYPOINTSTYLES)-1, ofd); + track_disp_all(start_rte, NULL, write_trk_waypt); + track_disp_all(write_trk_style, NULL, NULL); + route_disp_all(start_rte, NULL, write_rte_waypt); +} + +static +arglist_t gtm_args[] = { + { 0, 0, 0, 0, 0 } +}; + +ff_vecs_t gtm_vecs = { + ff_type_file, + FF_CAP_RW_ALL, + gtm_rd_init, + gtm_wr_init, + gtm_rd_deinit, + gtm_wr_deinit, + gtm_read, + gtm_write, + NULL, + gtm_args, +}; diff --git a/gpsbabel/readme.xml b/gpsbabel/readme.xml index 6e6a4c836..c7bbc4e75 100644 --- a/gpsbabel/readme.xml +++ b/gpsbabel/readme.xml @@ -811,6 +811,16 @@ supported by EasyGPS, ExpertGPS, and many other programs described at url="http://www.topografix.com/gpx_resources.asp">topografix.com +
+ + GPS TrackMaker format. + + GTM + Input and output support for waypoints, tracks and routes in + the GPS TrackMaker + binary format. + Code implemented by Gustavo Niemeyer. +
Mac OS HikeTech formats. TopoDraw, Link2GPS & diff --git a/gpsbabel/reference/sample.gtm b/gpsbabel/reference/sample.gtm new file mode 100644 index 0000000000000000000000000000000000000000..3ba596fdb21ab124877af0307e95b979223b1daa GIT binary patch literal 90544 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 XbJTzSm4^GAGcxDq%t_0=M$Y7Kd~fl7 literal 0 HcmV?d00001 diff --git a/gpsbabel/testo b/gpsbabel/testo index 1c24be6be..169c6245f 100755 --- a/gpsbabel/testo +++ b/gpsbabel/testo @@ -76,6 +76,14 @@ ${PNAME} -i geo -f geocaching.loc -o gpx -F ${TMPDIR}/gl.gpx ${PNAME} -i gpx -f ${TMPDIR}/gl.gpx -o gpsutil -F ${TMPDIR}/gpx.gpx compare ${TMPDIR}/gpx.gpx ${TMPDIR}/gu.wpt +# GTM +rm -f ${TMPDIR}/gl.gpx ${TMPDIR}/gpx.gpx +${PNAME} -i gtm -f reference/sample.gtm -o gpx -F ${TMPDIR}/gtm1.gpx +${PNAME} -i gpx -f ${TMPDIR}/gtm1.gpx -o gtm -F ${TMPDIR}/gtm.gtm +${PNAME} -i gtm -f ${TMPDIR}/gtm.gtm -o gpx -F ${TMPDIR}/gtm2.gpx +compare ${TMPDIR}/gtm1.gpx ${TMPDIR}/gtm2.gpx +compare ${TMPDIR}/gtm.gtm reference/sample.gtm + # Magellan Mapsend rm -f ${TMPDIR}/mm.mapsend ${TMPDIR}/mm.gps ${PNAME} -i geo -f geocaching.loc -o mapsend -F ${TMPDIR}/mm.mapsend diff --git a/gpsbabel/vecs.c b/gpsbabel/vecs.c index d53fcda5c..821e12960 100644 --- a/gpsbabel/vecs.c +++ b/gpsbabel/vecs.c @@ -30,72 +30,73 @@ typedef struct { const char *extension; } vecs_t; +extern ff_vecs_t an1_vecs; +extern ff_vecs_t bcr_vecs; +extern ff_vecs_t brauniger_iq_vecs; +extern ff_vecs_t cetus_vecs; +extern ff_vecs_t coastexp_vecs; +extern ff_vecs_t compegps_vecs; +extern ff_vecs_t copilot_vecs; +extern ff_vecs_t coto_vecs; +extern ff_vecs_t cst_vecs; +extern ff_vecs_t easygps_vecs; +extern ff_vecs_t garmin_vecs; +extern ff_vecs_t gcdb_vecs; +extern ff_vecs_t gdb_vecs; +extern ff_vecs_t geoniche_vecs; extern ff_vecs_t geo_vecs; +extern ff_vecs_t glogbook_vecs; +extern ff_vecs_t google_vecs; +extern ff_vecs_t gpilots_vecs; +extern ff_vecs_t gpl_vecs; +extern ff_vecs_t gpspilot_vecs; +extern ff_vecs_t gpsutil_vecs; extern ff_vecs_t gpx_vecs; -extern ff_vecs_t mag_svecs; +extern ff_vecs_t gtm_vecs; +extern ff_vecs_t hiketech_vecs; +extern ff_vecs_t holux_vecs; +extern ff_vecs_t HsaEndeavourNavigator_vecs; +extern ff_vecs_t html_vecs; +extern ff_vecs_t igc_vecs; +extern ff_vecs_t ignr_vecs; +extern ff_vecs_t kml_vecs; +extern ff_vecs_t lowranceusr_vecs; extern ff_vecs_t mag_fvecs; +extern ff_vecs_t maggeo_vecs; +extern ff_vecs_t magnav_vec; +extern ff_vecs_t magpdb_vecs; +extern ff_vecs_t mag_svecs; extern ff_vecs_t magX_fvecs; extern ff_vecs_t mapsend_vecs; extern ff_vecs_t mps_vecs; -extern ff_vecs_t gpsutil_vecs; -extern ff_vecs_t tiger_vecs; +extern ff_vecs_t msroute_vecs; +extern ff_vecs_t navicache_vecs; +extern ff_vecs_t netstumbler_vecs; +extern ff_vecs_t nmea_vecs; +extern ff_vecs_t nmn4_vecs; +extern ff_vecs_t overlay_vecs; +extern ff_vecs_t ozi_vecs; +extern ff_vecs_t palmdoc_vecs; extern ff_vecs_t pcx_vecs; -extern ff_vecs_t lowranceusr_vecs; -extern ff_vecs_t cetus_vecs; -extern ff_vecs_t gpspilot_vecs; -extern ff_vecs_t copilot_vecs; +extern ff_vecs_t ppdb_vecs; +extern ff_vecs_t psit_vecs; /* MRCB */ extern ff_vecs_t psp_vecs; -extern ff_vecs_t garmin_vecs; -extern ff_vecs_t holux_vecs; -extern ff_vecs_t xcsv_vecs; -extern ff_vecs_t tpg_vecs; -extern ff_vecs_t tpo_vecs; -extern ff_vecs_t magnav_vec; -extern ff_vecs_t tmpro_vecs; -extern ff_vecs_t gcdb_vecs; -extern ff_vecs_t easygps_vecs; extern ff_vecs_t quovadis_vecs; -extern ff_vecs_t gpilots_vecs; extern ff_vecs_t saroute_vecs; -extern ff_vecs_t navicache_vecs; -extern ff_vecs_t coastexp_vecs; -extern ff_vecs_t psit_vecs; /* MRCB */ extern ff_vecs_t shape_vecs; -extern ff_vecs_t geoniche_vecs; -extern ff_vecs_t gpl_vecs; -extern ff_vecs_t ozi_vecs; -extern ff_vecs_t nmea_vecs; +extern ff_vecs_t stmwpp_vecs; +extern ff_vecs_t tef_xml_vecs; extern ff_vecs_t text_vecs; -extern ff_vecs_t palmdoc_vecs; -extern ff_vecs_t html_vecs; -extern ff_vecs_t netstumbler_vecs; -extern ff_vecs_t HsaEndeavourNavigator_vecs; -extern ff_vecs_t igc_vecs; -extern ff_vecs_t brauniger_iq_vecs; -extern ff_vecs_t hiketech_vecs; -extern ff_vecs_t glogbook_vecs; -extern ff_vecs_t vcf_vecs; -extern ff_vecs_t overlay_vecs; -extern ff_vecs_t kml_vecs; -extern ff_vecs_t google_vecs; -extern ff_vecs_t maggeo_vecs; -extern ff_vecs_t an1_vecs; +extern ff_vecs_t tiger_vecs; +extern ff_vecs_t tmpro_vecs; extern ff_vecs_t tomtom_vecs; -extern ff_vecs_t tef_xml_vecs; -extern ff_vecs_t ppdb_vecs; +extern ff_vecs_t tpg_vecs; +extern ff_vecs_t tpo_vecs; +extern ff_vecs_t unicsv_vecs; +extern ff_vecs_t vcf_vecs; extern ff_vecs_t vitosmt_vecs; -extern ff_vecs_t gdb_vecs; -extern ff_vecs_t bcr_vecs; -extern ff_vecs_t coto_vecs; -extern ff_vecs_t ignr_vecs; -extern ff_vecs_t stmwpp_vecs; -extern ff_vecs_t msroute_vecs; -extern ff_vecs_t cst_vecs; -extern ff_vecs_t nmn4_vecs; -extern ff_vecs_t magpdb_vecs; -extern ff_vecs_t compegps_vecs; +extern ff_vecs_t xcsv_vecs; extern ff_vecs_t yahoo_vecs; -extern ff_vecs_t unicsv_vecs; static vecs_t vec_list[] = { @@ -496,6 +497,12 @@ vecs_t vec_list[] = { "Universal csv with field structure in first line", NULL }, + { + >m_vecs, + "gtm", + "GPS TrackMaker", + "gtm" + }, { NULL, NULL, -- 2.30.2